﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //LinkedList<int> ll = new LinkedList<int>();
            //ll.AddLast(10);
            //ll.AddLast(12);
            //ll.AddLast(13);
            //LinkedListNode<int> node = ll.First;
            //node = node.Next;
            //node = node.Next;
            //Console.WriteLine(node.Value);
            //while (node != null)
            //{
            //    Console.WriteLine(node.Value);
            //    node = node.Next;
            //}


            //Queue queue = new Queue();
            //queue.Enqueue(10);
            //queue.Enqueue(20);
            //queue.Enqueue(30);
            //Console.WriteLine(queue.Dequeue());
            //Console.WriteLine(queue.Dequeue());
            //Console.WriteLine(queue.Dequeue());


            //Stack<int> stack = new Stack<int>();
            //stack.Push(10);
            //stack.Push(20);
            //stack.Push(30);
            //stack.Push(40);
            //Console.WriteLine(stack.Pop());
            //Console.WriteLine(stack.Pop());
            //Console.WriteLine(stack.Pop());

            Dictionary<string, int> dict = new Dictionary<string, int>();
            dict["hello"] = 23;
            dict["test"] = 100;
            Console.WriteLine(dict["hello"]);
            Console.WriteLine(dict["test"]);
        }
    }
}

    class Program
    {
        public static List<object> ParseTheString(List<object> lis, List<double> mas, string s, string s3, string z, double x)
        {
            for (int i = 0; i < s.Length; i++)
            {
                if (s.Length <= 2)
                {
                    Console.WriteLine("Вы ввели выражение не типа (operand1 operation operand2)");
                    break;
                }
                while ('0' <= s[i] && s[i] <= '9')
                {
                    z = s[i].ToString();
                    s3 += z;
                    i++;
                    if (i == s.Length)
                    {
                        break;
                    }
                    if ('a' <= s[i] && s[i] <= 'z')
                    {
                        Console.WriteLine("Вы ввели выражение c с буквой");
                        break;
                    }
                }
                if (s3.Length != 0)
                {
                    if ('0' <= s3[0] && s3[0] <= '9')
                    {
                        x = Int32.Parse(s3);
                        lis.Add(x);
                        s3 = "";
                    }
                }
                if (i != s.Length)
                {
                    if (s[i] == '+')
                    {
                        lis.Add(s[i]);
                    }
                    if (s[i] == '-')
                    {
                        lis.Add(s[i]);
                    }
                    if (s[i] == '*')
                    {
                        lis.Add(s[i]);
                    }
                    if (s[i] == '/')
                    {
                        lis.Add(s[i]);
                    }
                    if (s[i] == '(')
                    {
                        lis.Add(s[i]);

                    }
                    if (s[i] == ')')
                    {
                        lis.Add(s[i]);
                    }
                    if (s[i] == '@')
                    {
                        lis.Add(s[i]); ;
                    }
                    if (s[i] == 'e')
                    {
                        lis.Add(s[i]);
                    }
                    if (s[i] == 'd')
                    {
                        lis.Add(s[i]);
                    }
                    if (s[i] == 'c')
                    {
                        lis.Add(s[i]);

                    }
                    if (s[i] == 'b')
                    {
                        lis.Add(s[i]);
                    }
                    if (s[i] == 'a')
                    {
                        lis.Add(s[i]); ;
                    }
                }
            }
            for (int i = 0; i < lis.Count; i++)
            {
                if (lis[i].ToString() == "@")
                {
                    lis[i] = int.Parse(File.ReadAllText("Text1.txt"));
                }

                if (lis[i].ToString() == "a")
                {
                    lis[i] = mas[0];
                }
                if (lis[i].ToString() == "b")
                {
                    lis[i] = mas[1];
                }
                if (lis[i].ToString() == "c")
                {
                    lis[i] = mas[2];
                }
                if (lis[i].ToString() == "d")
                {
                    lis[i] = mas[3];
                }
                if (lis[i].ToString() == "e")
                {
                    lis[i] = mas[4];
                }
            }
            return lis;
        }
        public static List<double> Store(List<double> mas, List<object> lis)
        {
            Console.WriteLine("Для сохранения введите 'store name' для продолжения нажмите enter) ");
            string s = Console.ReadLine();
            string[] str = s.Split();
            if (str.Length != 2)
            {
                Console.WriteLine("Вы ввели не стадартное имя");
            }
            if (str[0] == "store")
            {
                mas.Add(Convert.ToInt32(lis[0]));
            }
            return mas;
        }
        static void Main(string[] args)
        {
            string str = null;
            Console.WriteLine("Для ввода значений введите ENTER ");
            Console.WriteLine("Для выхода введите exit ");
            List<double> mas = new List<double>();
            str = Console.ReadLine();
            while (str != "exit")
            {
                int t = 0;
                int k = 0;
                //int from = 0;
                //int to = 0;
                double rezalt = 0;
                double x = 0;
                string z = "";
                string s3 = "";
                Console.WriteLine("Введите выражение типа (operand1 operation operand2)");
                string s = Console.ReadLine();
                List<object> lis = new List<object>();
                lis = ParseTheString(lis, mas, s, s3, z, x);
                //DoMaths2(lis, from);
                //DoMathsSimple(lis, from, to);
                //Calcul c = new Calcul();
                Counter(lis, 0);
                Store(mas, lis);

                Console.WriteLine("Для ввода значений введите ENTER ");
                Console.WriteLine("Для выхода введите exit ");
            }
            Console.ReadLine();
        }
        //        }
        //    }
        //}
        //class Calc
        //{
        //    public string Calculate(string expression, out double result)
        //    {
        //        result = 0;
        //        return "";
        //    }
        //}
        //class Calcul
        //   {


        public static void Counter(List<object> lis, int t)
        {
            int j = t;
            
            for (int k = t; k < lis.Count; k++)
            {
                if (lis[k].ToString() == "(")
                {
                    Counter(lis, k + 1);
                    lis.RemoveAt(k);
                    lis.RemoveAt(k + 1);
                }
            }

            if (lis.Count == 1)
            {
                Console.WriteLine(lis[0]);
                File.WriteAllText("Text1.txt", lis[0].ToString());
                return;
            }

            double rezalt;

            while (j < lis.Count)
            {
                if (lis[j].ToString() == ")")
                {
                    break;
                }

                if (lis[j].ToString() == "*")
                {
                    rezalt = ((double)lis[j - 1]) * ((double)lis[j + 1]);
                    lis[j - 1] = rezalt;
                    lis.RemoveRange(j, 2);
                    rezalt = 0;
                    j++;
                    if (j >= 2)
                    {
                        j = 0;
                    }
                }
                if (lis[j].ToString() == "/")
                {
                    rezalt = (double.Parse(lis[j - 1].ToString())) / (double.Parse(lis[j + 1].ToString()));
                    lis[j - 1] = rezalt;
                    lis.RemoveRange(j, 2);
                    rezalt = 0;
                    j++;
                    if (j >= 2)
                    {
                        j = 0;
                    }
                }
                j++;
            }
            for (int i = t; i < lis.Count; i++)
            {
                if (lis[i].ToString() == ")")
                {
                    return;
                }

                if (lis[i].ToString() == "+")
                {
                    rezalt = (double.Parse(lis[i - 1].ToString())) + (double.Parse(lis[i + 1].ToString()));
                    lis[i - 1] = rezalt;
                    lis.RemoveRange(i, 2);
                    rezalt = 0;
                    i--;
                }
                else if (lis[i].ToString() == "-")
                {
                    rezalt = (double.Parse(lis[i - 1].ToString())) - (double.Parse(lis[i + 1].ToString()));
                    lis[i - 1] = rezalt;
                    lis.RemoveRange(i, 2);
                    rezalt = 0;
                    i--;
                }
            }
        }
        static List<object> Counterbrecket(string s, List<object> lis, List<double> mas, double rezalt, int pozithion, int t, int k)
        {
            int j = pozithion;
            for (int i = pozithion; i < lis.Count; i++)
            {
               
                while (j < lis.Count)
                {
                    if (lis[j].ToString() == ")")
                    {
                        break;
                    }
                    if (lis[j].ToString() == "*")
                    {
                        rezalt = (double.Parse(lis[j - 1].ToString())) * (double.Parse(lis[j + 1].ToString()));
                        lis[j - 1] = rezalt;
                        lis.RemoveRange(j, 2);
                        rezalt = 0;
                        j++;
                        if (j >= pozithion + 2)
                        {
                            j = pozithion;
                        }
                    }
                    if (lis[j].ToString() == "/")
                    {
                        rezalt = (double.Parse(lis[j - 1].ToString())) / (double.Parse(lis[j + 1].ToString()));
                        lis[j - 1] = rezalt;
                        lis.RemoveRange(j, 2);
                        rezalt = 0;
                        j++;
                        if (j >= pozithion + 2)
                        {
                            j = pozithion;
                        }
                    }
                    j++;
                }
                if (lis[i].ToString() == "+")
                {
                    rezalt = (double.Parse(lis[i - 1].ToString())) + (double.Parse(lis[i + 1].ToString()));
                    lis[i - 1] = rezalt;
                    lis.RemoveRange(i, 2);
                    rezalt = 0;
                    i++;
                    if (i >= pozithion + 2)
                    {
                        i = pozithion;
                    }
                }
                if (lis[i].ToString() == "-")
                {
                    rezalt = (double.Parse(lis[i - 1].ToString())) - (double.Parse(lis[i + 1].ToString()));
                    lis[i - 1] = rezalt;
                    lis.RemoveRange(i, 2);
                    rezalt = 0;
                    i++;
                    if (i >= pozithion + 2)
                    {
                        i = pozithion;
                    }
                }
                if (lis[i].ToString() == ")")
                {
                    break;
                }
            }
            return lis;
        }
    }
}
     //public  static int Counter(List<object> lis, int from)
     //   {
     //       for (int i = from; i < lis.Count; i++)
     //       {
     //           if (lis[i].ToString() == "(")
     //           {
     //               Counter(lis,i+1);
     //           }
     //       }
     //           return from;
     //   }

     //    static void DoMaths2(List<object> lis, int from)
     //   {
     //       int braceEnd = -1;
     //       for (int i = from; i < lis.Count; i++)
     //       {
     //           if (lis[i].ToString() == "(")
     //           {
     //               lis.RemoveAt(i);
     //               DoMaths2(lis, i + 1);
                   
     //           }
     //           if (lis[i].ToString() == ")")
     //           {
     //               braceEnd = i;
     //               lis.RemoveAt(braceEnd);
     //               break;
     //           }
     //       }
     //       if (braceEnd == -1)
     //       {
     //           DoMathsSimple(lis, from, lis.Count);
     //       }
     //       else
     //       {
     //           DoMathsSimple(lis, from, braceEnd - 1);
     //       }
     //   }


     //    static List<object> DoMathsSimple(List<object> lis, int from, int to)
     //    {

     //        for (int i = from; i < Math.Min(lis.Count, to); i++)
     //        {
     //            double tmp;
     //            if (lis[i].ToString() == "*")
     //            {
     //                tmp = Convert.ToInt32(lis[i - 1]) * Convert.ToInt32(lis[i + 1]);
     //                lis[i - 1] = tmp;
     //                lis.RemoveRange(i, 2);
     //                i--;
     //            }
     //            else if (lis[i].ToString() == "/")
     //            {
     //                tmp = Convert.ToInt32(lis[i - 1]) / Convert.ToInt32(lis[i + 1]);
     //                lis[i - 1] = tmp;
     //                lis.RemoveRange(i, 2);
     //                i--;
     //            }
     //        }
     //        for (int i = from; i < Math.Min(lis.Count, to); i++)
     //        {
     //            double tmp;
     //            if (lis[i].ToString() == "+")
     //            {
     //                tmp = Convert.ToInt32(lis[i - 1]) + Convert.ToInt32(lis[i + 1]);
     //                lis[i - 1] = tmp;
     //                lis.RemoveRange(i, 2);
     //                i--;
     //            }
     //            else if (lis[i].ToString() == "-")
     //            {
     //                tmp = Convert.ToInt32(lis[i - 1]) - Convert.ToInt32(lis[i + 1]);
     //                lis[i - 1] = tmp;
     //                lis.RemoveRange(i, 2);
     //                i--;
     //            }
     //        }
     //        return lis;
     //    }

